#ifndef LOGGER_H
#define LOGGER_H

#include "../archivo/ArchivoTexto.h"
#include <string>
#include <sstream>
#include <iostream>
using namespace std;

//para mostrar los mensajes de log segun el nivel de debug elejido.
typedef enum {
	BAJO = 1,
	MEDIO = 2,
	ALTO = 3
} enumNivelDeDebug;

/*convencion de la eleccion de el nivel de debug (revisar)
 * BAJO: estado de ciertos objetos en la entrada y salida de un modulo de operacion de el proyecto
 * MEDIO: queda a criterio
 * ALTO: solo detalles de mensajes en metodos que pueden aparecer dento de un metodo.
 *
 * */


//Implementacion del Singleton Logger (Guarda mensajes de estado a un archivo de texto)
class Logger{
	ArchivoTexto* logFile ;
private:
	static bool instanceFlag;
    static string logFilename;
	static Logger *instance;

	bool debugActivo ;
	enumNivelDeDebug nivelDebug;

	Logger();

public:
	 //Retorna la unica instancia del Logger
	static Logger* getInstance();

	//Setea el nombre del archivo sobre el cual se genera el log.
	//POR DEFECTO = debug.log
	void setLogFilename(const string& fileName);

	//Para generar mensaje de log de error
	void error(const string& clase, const string& metodo, const string& mensaje);

	//Permite generar mensajes de DEBUG segun el nivel de debug elejido.
	void debug(const string& clase, const string& metodo, const string& mensaje, enumNivelDeDebug nivelBebugElejido);
	void debug(const string& clase, const string& metodo, std::stringstream mensaje, enumNivelDeDebug nivelBebugElejido);

	//Activa/Desactiva FLAG de DEBUG
	void setDebug(bool valor);

	//setea el NIVEL DE DEBUG  de todo el sistema
	void setNivelDebug(enumNivelDeDebug nuevoNivelBebug);

	//Para flushear el archivo de log
	void flush();

private:
	static string toUpper(std::string s);

	~Logger();
};

#endif
